#ifndef MY_TIMER_H
#define MY_TIMER_H


typedef struct my_timer
{
    unsigned long time;
    unsigned long time_tick;
    unsigned char is_use:1;
    unsigned char set:1;
    unsigned char num:6;
    void* userdata;
    void (*timer_callback)(void*);
    struct my_timer *next;
} __timer;
typedef struct my_timer *my_timer_t;


/**
 * @brief 注册定时器,时基定时器为systick中定义的时基
 *
 * @param tm 定时器指针
 */
void timer_register(my_timer_t tm);


/**
 * @brief 
 * 
 * @param tm 
 * @param time time个tick触发一次
 * @param start_time start_time 从start_time开始计时
 * @param num 触发次数,取值0-63,0为无限次循环
 * @param timer_callback 定时器超时回调
 */
void timer_set(my_timer_t tm, unsigned long time,unsigned long start_time,unsigned char type, void (*timer_callback)(void*),void* userdata);



/**
 * @brief 开始定时器
 * 
 * @param tm 
 */
void timer_start(my_timer_t tm);



/**
 * @brief 定时器工作线程,不要在该线程中进行耗时操作
 * 
 */
void timer_thread(void);



/**
 * @brief 定时器触发时间重置,将触发时间改为time个tick并从start_time重新开始计时
 * 
 * @param tm 
 * @param time 希望多少time之后触发
 */
void timer_tick_reset(my_timer_t tm,unsigned long time,unsigned long start_time);


/**
 * @brief 定时器暂停
 * 
 * @param tm 
 */
void timer_stop(my_timer_t tm);


/**
 * @brief 定时器注册和设置2和一函数
 * 
 * @param tm 
 * @param time 定时器时间
 * @param num 运行次数
 * @param timer_callback 超时回调
 * @param use 是否开始定时器
 */
void timer_register_set(my_timer_t tm, unsigned long time,unsigned long start_time, unsigned char num, void (*timer_callback)(void*),void*userdata, unsigned char use);

/**
 * @brief 定时器是否被置位
 * 
 * @param tm 
 * @return char 1为定时器时间到了被置位还未处理,需要timer_set_clear清空
 */
char timer_is_set(my_timer_t tm);


/**
 * @brief 清空事件置位
 * 
 * @param tm 
 */
void timer_set_clear(my_timer_t tm);

/**
 * @brief 放到systick中断中
 * @param systick 系统时间
 * 
 */
void timer_irq(unsigned long systick);

/**
 * @brief 定时器回调处理
 * 
 */
void timer_thread(void);

/**
 * @brief 立即触发定时器
 * 
 * @param tm 
 */
void timer_trigger(my_timer_t tm);
#endif // !TIMER_H
